# -*- coding: utf-8 -*- 
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/10/15
# @File : 27.Array Description.py
# AC：独自自己完成。二维双循环dp，记得画表！
"""
题目要求：
你知道一个数组有n个整数，在1和m之间，两个相邻值之间的绝对差不超过1。给定一个数组的描述，其中一些值可能是未知的，您的任务是计算匹配该描述的序列的数量。
Input:
3 5
2 0 2

Output:
3

解法：
dp[i][j]表示前i个数中最后一个数取j的序列个数.
所以dp[i]就表示由前i个数可以得到的总序列个数。

转移是分是0还是不是0（固定了）两种情况。
if(x[i] == 0):
            for j in range(1,m+1):
                dp[i][j] = (dp[i-1][j-1] + dp[i-1][j] + dp[i-1][j+1])%modulo
else:
                dp[i][x[i]] = (dp[i-1][x[i]-1] + dp[i-1][x[i]] + dp[i-1][x[i]+1])%modulo
"""
modulo = 10 ** 9 + 7
def dp_solve():
    dp = [[0]*(m+2) for _ in range(n)]
    if(x[0]==0):
        for i in range(1,m+1):
            dp[0][i] = 1
    else:
        dp[0][x[0]] = 1
    for i in range(1,n):
        if(x[i] == 0):
            for j in range(1,m+1):
                dp[i][j] = (dp[i-1][j-1] + dp[i-1][j] + dp[i-1][j+1])%modulo
        else:
            dp[i][x[i]] = (dp[i-1][x[i]-1] + dp[i-1][x[i]] + dp[i-1][x[i]+1])%modulo
    return sum(dp[n-1])%modulo

if __name__ == '__main__':
    n,m = map(int,input().split())
    x = list(map(int,input().split()))
    ans = dp_solve()
    print(ans)


